/**
 * Wandelt einen String ins das Format Datum um.
 * Ausserdem enthaelt diese Klassen die Methoden um einen String in 
 * den Typ Integer oder Long umzuwandeln.
 * 
 * Datei: DatumParser.java             Autor: Simon Schindelmann 
 * Datum: 27.11.11                     Version: 0.1
 * 
 * Historie: 
 * 27.11.11:  v0.1    Klasse wurde angelegt.
 * 05.12.11   v0.2    Methoden stringZuInteger und stringZuLong 
 *                    hinzugefuegt.
 */
package medienverwaltung;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import medienverwaltung.simulation.Uebersetzung;
import personenverwaltung.AktuellesDatum;
import personenverwaltung.Datum;

public class DatumParser
{
  // Enthaelt die aktuelle Sprache.
  private static Uebersetzung uebersetzung = Uebersetzung.gibSprache ();

  public DatumParser ()
  {
  }


  /**
   * Wandelt ein Datum von String Format ins Datum Format um.
   * @param datum Datum im als String.
   * @return Datum im Format Datum.
   */
  public static Datum stringZuDatum (String datum)
      throws KeinDatumFormat
  {
    uebersetzung = Uebersetzung.gibSprache ();
    int jahr, monat, tag;
    Datum d;
    
    /*
     * String wird bei einen Punkt zerteilt und die Teile in einem Array
     * gespeichert.
     */
    String Trennsymoble = "\\.";
    String[] tokens = datum.split (Trennsymoble);
    
    //Prueft ob das Datum aus 3 Teilen besteht.
    if (tokens.length != 3)
    {
      throw new KeinDatumFormat (uebersetzung.lokal
          .gibUebersetzung ("Entspricht nicht den Datum Format"));
    }
    
    // Prueft ob es sich nur um Zahlen handelt.
    for (int i = 0; i < tokens.length; i++)
    {
      Pattern pat = Pattern.compile ("[^0-9]+");
      Matcher mat = pat.matcher (tokens[i].trim());
      while (mat.find ())
      {
        throw new KeinDatumFormat (uebersetzung.lokal
            .gibUebersetzung ("Entspricht nicht den Datum Format"));
      }
    }
    
    tag = stringZuInteger (tokens[0]);
    monat = stringZuInteger (tokens[1]);
    jahr = stringZuInteger (tokens[2]);
    d = new Datum (tag, monat, jahr);
    
    /*
     * Hier wird geprueft ob das Datum in der Zukunft liegt. Falls ja
     * wird eine Ausnahme geworfen.
     */
    if (d.gibJahr () > AktuellesDatum.gibJahr ()
        || d.gibJahr () == AktuellesDatum.gibJahr ()
        && d.gibMonat () > AktuellesDatum.gibMonat ()
        || d.gibJahr () == AktuellesDatum.gibJahr ()
        && d.gibMonat () == AktuellesDatum.gibMonat ()
        && d.gibTag () > AktuellesDatum.gibTag ())
    {
      throw new KeinDatumFormat (uebersetzung.lokal
          .gibUebersetzung ("Datum liegt in der Zukunft"));
    }
    return d;
  }


  /**
   * Wandelt Strings in Integer um. Walls der Wert keine Zahl ist kann
   * diese nicht umgewandelt werden und es wird eine Ausnahme geworfen.
   * @param s String der umgewandelt wird.
   * @return Der zu Integer umgewandelte String.
   */
  public static int stringZuInteger (String s)
  {
    uebersetzung = Uebersetzung.gibSprache ();
    int temp = 0;
    Pattern pat = Pattern.compile ("[^0-9]+");
    Matcher mat = pat.matcher (s.trim());
    while (mat.find ())
    {
      throw new IllegalArgumentException (
          uebersetzung.lokal.gibUebersetzung ("Keine gueltige Zahl")
              + "\n"
              + uebersetzung.lokal
                  .gibUebersetzung ("Bei Abmessungen sind nur " +
                                    "positive ganze Zahlen erlaubt"));
    }
    temp = Integer.parseInt (s.trim ());
    return temp;
  }


  /**
   * Wandelt Strings in Long um. Walls der Wert keine Zahl ist kann
   * diese nicht umgewandelt werden und es wird eine Ausnahme geworfen.
   * @param s der String der in long umgewandelt werden soll
   * @return der zu long umgewandelte String
   */
  public static long stringZuLong (String s)
  {
    uebersetzung = Uebersetzung.gibSprache ();
    long temp = 0;
    Pattern pat = Pattern.compile ("[^0-9]+");
    Matcher mat = pat.matcher (s.trim());
    while (mat.find ())
    {
      throw new IllegalArgumentException (uebersetzung.lokal
          .gibUebersetzung ("Keine gueltige Zahl"));
    }
    temp = Long.parseLong (s.trim ());
    return temp;
  }

}
